import 'dart:async';
import 'dart:io';
import 'dart:ui';
import 'package:ideology/features/models/editor_tab.dart';

/// 自动保存管理器
///
/// 用于监听编辑器标签页的文本变更并自动保存到文件系统：
/// - 在文本发生变化后 1 秒触发保存（防抖处理）
/// - 保存完成后清除 `dirty` 状态并通知外部回调
/// - 支持注册/注销标签页监听，避免内存泄漏
class AutoSaveManager {
  /// 创建自动保存管理器
  ///
  /// [onSaved] 外部保存完成时的回调（例如刷新 UI 或提示用户）
  AutoSaveManager({required Future<void> Function(EditorTab tab) onSaved})
      : _onSaved = onSaved;

  /// 外部保存完成的回调
  final Future<void> Function(EditorTab tab) _onSaved;

  /// 每个标签页对应的文本监听器
  final Map<EditorTab, VoidCallback> _tabTextListeners = {};

  /// 每个标签页对应的定时保存任务
  final Map<EditorTab, Timer> _autoSaveTimers = {};

  /// 注册指定 [tab] 的自动保存监听
  ///
  /// - 当文本发生变化时，标记为 `dirty` 并调度保存任务
  void register(EditorTab tab) {
    void listener() {
      tab.dirty.value = true;
      _scheduleSave(tab);
    }
    _tabTextListeners[tab] = listener;
    tab.text.addListener(listener);
  }

  /// 注销指定 [tab] 的监听与定时器
  void unregister(EditorTab tab) {
    _autoSaveTimers[tab]?.cancel();
    tab.text.removeListener(_tabTextListeners[tab] ?? () {});
    _autoSaveTimers.remove(tab);
    _tabTextListeners.remove(tab);
  }

  /// 调度保存任务（延时 1 秒执行）
  ///
  /// - 将文本内容写入文件
  /// - 保存成功后清除 `dirty` 状态
  /// - 调用外部 [onSaved] 回调
  void _scheduleSave(EditorTab tab) {
    _autoSaveTimers[tab]?.cancel();
    _autoSaveTimers[tab] = Timer(const Duration(seconds: 1), () async {
      try {
        final file = File(tab.fullPath);
        await file.create(recursive: true);
        await file.writeAsString(tab.text.value);
        tab.dirty.value = false;
        await _onSaved(tab); // 通知外部刷新签名
      } catch (_) {
        // 可在 UI 层提示保存失败
      }
    });
  }
}
